#!/bin/sh
#
# Slim login manager Xsession script
#

command="$@"

# this will go into slim.log along with all other echo's
# good for debugging where things go wrong
echo "$0: Beginning session setup..."

# First read /etc/profile and .profile
test -f /etc/profile && . /etc/profile
test -f "$HOME/.profile" && . "$HOME/.profile"
# Second read /etc/xprofile and .xprofile for X specific setup
test -f /etc/xprofile && . /etc/xprofile
test -f "$HOME/.xprofile" && . "$HOME/.xprofile"

# wrap possible arguments to determine whether to treat special or not
if [ "x$command" = "xcustom" ] || [ "x$command" = "xCustom" ] || [ "x$command" = "xdefault" ] || [ "x$command" = "xDefault" ]; then
  command="Xsession"
fi
if [ "x$command" = "x" ]; then
  # no default specified, check if Xsession will complete
  # and if not then assign XSESSION to command
  if [ -x "$HOME/.xsession" ] || [ -x "$HOME/.Xclients" ] || [ -x /etc/X11/xinit/Xclients ] || [ -x /etc/X11/Xclients ]; then
    command="Xsession"
  else
    command=$XSESSION
  fi
fi

# most of this is from /etc/X11/chooser.sh
sessionscript=""
if [ -n "${command}" ]; then
  # find a match for $command in /etc/X11/Sessions
  for x in /etc/X11/Sessions/* ; do
    if [ "`echo ${x##*/} | awk '{ print toupper($1) }'`" = "`echo ${command} | awk '{ print toupper($1) }'`" ]; then
      sessionscript=${x}
      break
    fi
  done
  if [ -n "${sessionscript}" ]; then
    if [ -x "${sessionscript}" ]; then
      command="${sessionscript}"
    else
      command="/bin/sh ${sessionscript}"
    fi
  else

    # find an executable for $command
    x=""
    y=""

    for x in "${command}" "`echo ${command} | awk '{ print toupper($1) }'`" "`echo ${command} | awk '{ print tolower($1) }'`"
    do
      # Fall through ...
      if [ -x "`which ${x} 2>/dev/null`" ]; then
	y="`which ${x} 2>/dev/null`"
	break
      fi
    done
    # note , if the command could not be found then $command will be empty
    command="$y"
    unset x
    unset y
  fi
fi

# call xrdb and xmodmap and such, since $command is not a session script
if [ -z "${sessionscript}" ]; then
  userresources="$HOME/.Xresources"
  usermodmap="$HOME/.Xmodmap"
  userxkbmap="$HOME/.Xkbmap"

  sysresources=/etc/X11/Xresources 
  sysmodmap=/etc/X11/Xmodmap 
  sysxkbmap=/etc/X11/Xkbmap

  rh6sysresources=/etc/X11/xinit/Xresources 
  rh6sysmodmap=/etc/X11/xinit/Xmodmap 

  # merge in defaults
  if [ -f "$rh6sysresources" ]; then
    xrdb -merge "$rh6sysresources"
  fi

  if [ -f "$sysresources" ]; then
    xrdb -merge "$sysresources"
  fi

  if [ -f "$userresources" ]; then
    xrdb -merge "$userresources"
  fi

  # merge in keymaps
  if [ -f "$sysxkbmap" ]; then
    setxkbmap `cat "$sysxkbmap"`
    XKB_IN_USE=yes
  fi

  if [ -f "$userxkbmap" ]; then
    setxkbmap `cat "$userxkbmap"`
    XKB_IN_USE=yes
  fi

  #
  # Eeek, this seems like too much magic here
  #
  if [ -z "$XKB_IN_USE" -a ! -L /etc/X11/X ]; then
    if grep '^exec.*/Xsun' /etc/X11/X > /dev/null 2>&1 && [ -f /etc/X11/XF86Config ]; then
      xkbsymbols=`sed -n -e 's/^[     ]*XkbSymbols[   ]*"\(.*\)".*$/\1/p' /etc/X11/XF86Config`
      if [ -n "$xkbsymbols" ]; then
        setxkbmap -symbols "$xkbsymbols"
        XKB_IN_USE=yes
      fi
    fi
  fi

  # xkb and xmodmap don't play nice together
  if [ -z "$XKB_IN_USE" ]; then
    if [ -f "$rh6sysmodmap" ]; then
      xmodmap "$rh6sysmodmap"
    fi

    if [ -f "$sysmodmap" ]; then
      xmodmap "$sysmodmap"
    fi

    if [ -f "$usermodmap" ]; then
      xmodmap "$usermodmap"
    fi
  fi

  unset XKB_IN_USE
fi
unset sessionscript

# start failsafe session
if [ -z "${command}" ]; then
  echo "$0: Failed to find a command to start the session, so starting a failsafe xterm."
  exec xterm -geometry 80x24+0+0
fi

# run all system xinitrc shell scripts which will update command
if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for i in /etc/X11/xinit/xinitrc.d/* ; do
    if [ -x "$i" ]; then
      . "$i"
    fi
  done
  unset i
fi

echo "$0: Setup done, will execute: $command"
exec $command

# vim:ts=4
